import JSEncrypt from 'jsencrypt';
import { fetchPublicKey } from '../services/commonService';

let cachedPublicKey: string = '';

/**
 * 异步获取公钥（带缓存）
 */
export async function getPublicKey(): Promise<string> {
  if (cachedPublicKey) return cachedPublicKey;
  try {
    const response = await fetchPublicKey();
    cachedPublicKey = response.data;
    return cachedPublicKey;
  } catch (error: any) {
    throw new Error('获取公钥失败: ' + (error.message || error));
  }
}

function formatPublicKey(base64Key: string): string {
  const pemHeader = '-----BEGIN PUBLIC KEY-----\n';
  const pemFooter = '\n-----END PUBLIC KEY-----';
  const formatted = base64Key.match(/.{1,64}/g)?.join('\n') ?? base64Key;
  return pemHeader + formatted + pemFooter;
}

/**
 * 使用公钥加密密码（RSA-PKCS1）
 * @param password 明文密码
 * @param publicKey 公钥字符串（PEM格式）
 */
export function encryptPassword(password: string, publicKey: string): string {
  try {
    const pemKey = formatPublicKey(publicKey);
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(pemKey);

    // 使用PKCS1 v1.5填充方式加密
    const encrypted = encryptor.encrypt(password);

    if (!encrypted) {
      throw new Error('加密返回空结果');
    }

    return encrypted; // jsencrypt直接返回base64格式
  } catch (error: any) {
    console.error('密码加密失败:', error);
    throw new Error('密码加密失败: ' + (error.message || error));
  }
}

/**
 * 直接加密（自动获取公钥）
 */
export async function encryptPasswordAuto(password: string): Promise<string> {
  const publicKey = await getPublicKey();
  return encryptPassword(password, publicKey);
}
